<?php
/**
 * 统计数据API接口
 * 处理访问量统计、搜索统计等功能
 */

// API日志记录已移除

// 会话将由config/config.php统一管理

// 动态确定正确的路径
$configPath = file_exists('../config/config.php') ? '../config/config.php' : 'config/config.php';
$dbPath = file_exists('../includes/database.php') ? '../includes/database.php' : 'includes/database.php';

require_once $configPath;
require_once $dbPath;

// 设置响应头
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');

// 处理OPTIONS请求（CORS预检）
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

$db = new Database();

try {
    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
        handleGetRequest($db);
    } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
        handlePostRequest($db);
    } else {
        jsonResponse(false, '不支持的请求方法');
    }
} catch (Exception $e) {
    writeLog("Stats API Error: " . $e->getMessage(), 'ERROR');
    jsonResponse(false, '服务器内部错误');
}

/**
 * 处理GET请求
 * @param Database $db 数据库实例
 */
function handleGetRequest($db) {
    $action = $_GET['action'] ?? 'get';
    
    switch ($action) {
        case 'get':
            getStats($db);
            break;
            
        case 'daily':
            getDailyStats($db);
            break;
            
        case 'popular':
            getPopularLinks($db);
            break;
            
        default:
            jsonResponse(false, '无效的操作类型');
    }
}

/**
 * 处理POST请求
 * @param Database $db 数据库实例
 */
function handlePostRequest($db) {
    $input = json_decode(file_get_contents('php://input'), true);
    
    if (!$input || !isset($input['action'])) {
        jsonResponse(false, '无效的请求数据');
    }
    
    $action = $input['action'];
    
    switch ($action) {
        case 'track_click':
            trackNavClick($db, $input);
            break;
            
        case 'track_search':
            trackSearch($db, $input);
            break;
            
        case 'increment_visit':
            incrementVisit($db);
            break;
            
        default:
            jsonResponse(false, '无效的操作类型');
    }
}

/**
 * 获取统计数据
 * @param Database $db 数据库实例
 */
function getStats($db) {
    $stats = $db->getStats();
    
    // 计算今日访问量
    $today = date('Y-m-d');
    $todayVisits = $stats['daily_visits'][$today] ?? 0;
    
    // 计算今日搜索量
    $todaySearches = $stats['daily_searches'][$today] ?? 0;
    
    // 获取热门链接
    $navigations = $db->getNavigations();
    $popularLinks = array_slice(
        array_filter($navigations, function($nav) {
            return isset($nav['clicks']) && $nav['clicks'] > 0;
        }),
        0, 10
    );
    
    // 排序热门链接
    usort($popularLinks, function($a, $b) {
        return ($b['clicks'] ?? 0) - ($a['clicks'] ?? 0);
    });
    
    $result = [
        'total_visits' => $stats['total_visits'] ?? 0,
        'today_visits' => $todayVisits,
        'daily_visits' => $stats['daily_visits'] ?? [],
        'total_search_count' => $stats['total_search_count'] ?? ($stats['search_count'] ?? 0), // 兼容旧版
        'today_search_count' => $todaySearches,
        'daily_searches' => $stats['daily_searches'] ?? [],
        'popular_links' => $popularLinks,
        'last_updated' => $stats['last_updated'] ?? date('Y-m-d H:i:s')
    ];
    
    jsonResponse(true, '获取统计数据成功', $result);
}

/**
 * 获取每日统计数据
 * @param Database $db 数据库实例
 */
function getDailyStats($db) {
    $stats = $db->getStats();
    $dailyVisits = $stats['daily_visits'] ?? [];
    
    // 确保有最近30天的数据
    $result = [];
    for ($i = 29; $i >= 0; $i--) {
        $date = date('Y-m-d', strtotime("-$i days"));
        $result[] = [
            'date' => $date,
            'visits' => $dailyVisits[$date] ?? 0
        ];
    }
    
    jsonResponse(true, '获取每日统计成功', $result);
}

/**
 * 获取热门链接
 * @param Database $db 数据库实例
 */
function getPopularLinks($db) {
    $navigations = $db->getNavigations();
    
    // 过滤并排序
    $popularLinks = array_filter($navigations, function($nav) {
        return isset($nav['clicks']) && $nav['clicks'] > 0;
    });
    
    usort($popularLinks, function($a, $b) {
        return ($b['clicks'] ?? 0) - ($a['clicks'] ?? 0);
    });
    
    // 只返回前20个
    $result = array_slice($popularLinks, 0, 20);
    
    jsonResponse(true, '获取热门链接成功', $result);
}

/**
 * 记录导航点击
 * @param Database $db 数据库实例
 * @param array $input 输入数据
 */
function trackNavClick($db, $input) {
    if (!isset($input['nav_id'])) {
        jsonResponse(false, '缺少导航ID');
    }
    
    $navId = intval($input['nav_id']);
    
    if (!$navId) {
        jsonResponse(false, '无效的导航ID');
    }
    
    // 检查导航是否存在
    $navigation = $db->getNavigationById($navId);
    if (!$navigation) {
        jsonResponse(false, '导航不存在');
    }
    
    // 增加点击次数
    $success = $db->incrementClicks($navId);
    
    if ($success) {
        writeLog("Navigation click tracked: ID=$navId, IP=" . getClientIP());
        jsonResponse(true, '点击统计记录成功');
    } else {
        jsonResponse(false, '记录点击统计失败');
    }
}

/**
 * 记录搜索统计
 * @param Database $db 数据库实例
 * @param array $input 输入数据
 */
function trackSearch($db, $input) {
    if (!isset($input['query']) || empty(trim($input['query']))) {
        jsonResponse(false, '缺少搜索关键词');
    }
    
    $query = sanitizeInput($input['query']);
    $engine = sanitizeInput($input['engine'] ?? 'baidu'); // 获取搜索引擎信息，默认为百度
    
    // 使用新的搜索统计方法
    $success = $db->incrementSearchCount($query, $engine);
    
    if ($success) {
        writeLog("Search tracked: query='$query', engine='$engine', IP=" . getClientIP());
        jsonResponse(true, '搜索统计记录成功');
    } else {
        jsonResponse(false, '记录搜索统计失败');
    }
}

/**
 * 增加访问量
 * @param Database $db 数据库实例
 */
function incrementVisit($db) {
    // 移除管理员登录状态的判断 - 访问量统计不应该受管理后台登录状态影响
    // 只要是前台页面的访问请求，都应该被统计
    
    // 增加总访问量和每日访问量
    $success = $db->incrementVisits();
    
    if ($success) {
        writeLog("Visit tracked: IP=" . getClientIP());
        jsonResponse(true, '访问统计记录成功');
    } else {
        jsonResponse(false, '记录访问统计失败');
    }
}